/*!
 * \file frstr.h
 *
 * \brief 字符串管理接口
 *
 * All Rights Reserved Copyright (C) 2014 broada,Co.,Ltd.\n
 * 结构体和接口定义，实现字符串操作
 *
 * \version 2.0
 * \author yaohl
 * \date 2014/09/29
 *
 */


#ifndef __FRSTR_H_
#define __FRSTR_H_

/*! @brief 公用字符串操作函数 */
typedef struct __st_string
{
    char *p_str;
    unsigned int ui_len;
    unsigned int ui_allocated_size;
} Frstr;

/*!
 * frstr初始化
 *
 * \param ui_size (数据长度)
 *
 * \return Frstr*  (normal)\n
 *         NULL    (error)
 *
 */
Frstr* frstr_new(unsigned int ui_size);

/*!
 * 追加数据到frstr
 *
 * \param *p_frstr         (Frstr)
 * \param *p_append_val    (数据)
 * \param ui_append_size  (数据长度)
 *
 * \return 0       (normal)\n
 *         1       (error)\n
 *         2       (内存过大)
 *
 */
int  frstr_append(Frstr *p_frstr, const char *p_append_val, unsigned int ui_append_size);
#define FRSTR_APPEND_STR(x,y) frstr_append(x, y, (y?strlen(y):0))
#define FRSTR_APPEND_BIN(x,y,z) frstr_append(x, y, z)

/*!
 * 截断frstr里数据
 *
 * \param *p_frstr (Frstr)
 * \param ui_len   (数据的剩余长度)
 *
 * \return 0        (normal)\n
 *         1        (error)
 *
 */
void frstr_trunc(Frstr *p_frstr, unsigned int ui_len);

/* 获取内存空间大小 */
#define FRSTR_SIZE(x) ( (x)?x->ui_allocated_size:0)
/* 获取已经使用内存大小 */
#define FRSTR_LEN(x) ( (x)?x->ui_len:0)

/*!
 * 释放frstr
 *
 * \param **pp_frstr (Frstr)
 *
 */
void frstr_free(Frstr **pp_frstr);

/*!
 * 释放frstr(但不释放使用内存p_str)
 *
 * \param **pp_frstr (Frstr)
 *
 */
char *frstr_free2(Frstr **pp_frstr);

#endif

